/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.losalpes.client;

import com.losalpes.buy.IBuyService;
import com.losalpes.persistence.entity.Cliente;
import java.util.List;
import javax.faces.model.SelectItem;
import com.losalpes.persistence.entity.Ciudad;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;

/**
 * Permite 
 * @author Henry.Quiroga
 */
public class ClientBean {

    @EJB
    private IClientService clientService;
    @EJB
    private IBuyService buyService;
    private Cliente cliente,  clienteBusqueda;
    private Integer pais,  departamento,  ciudad;
    private String mensaje = "",  noeliminar = "",  controlMensaje = "";

    /**
     * Constructor de la clase
     */
    public ClientBean() {
        cliente = new Cliente();
        clienteBusqueda = new Cliente();

        ciudad = 0;
        departamento = 0;
        pais = 0;
    }

    /**
     * Obtiene el cliente actual
     * @return
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * Establece el cliente actual
     * @param cliente
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * Obtiene el cliente de busqueda actual
     * @return
     */
    public Cliente getClienteBusqueda() {
        return clienteBusqueda;
    }

    /**
     * Establce el cliente de busqueda actual
     * @param clienteBusqueda
     */
    public void setClienteBusqueda(Cliente clienteBusqueda) {
        this.clienteBusqueda = clienteBusqueda;
    }

    /**
     * Obtiene el identificador de la ciudad actual
     * @return
     */
    public Integer getCiudad() {
        return ciudad;
    }

    /**
     * Establce la ciudad actual
     * @param ciudad
     */
    public void setCiudad(Integer ciudad) {
        this.ciudad = ciudad;
    }

    /**
     * Obtiene el identificador del departamento actual
     * @return
     */
    public Integer getDepartamento() {
        return departamento;
    }

    /**
     * Establece el departamento actual
     * @param departamento
     */
    public void setDepartamento(Integer departamento) {
        this.departamento = departamento;
    }

    /**
     * Obtiene el pais actual
     * @return
     */
    public Integer getPais() {
        return pais;
    }

    /**
     * Establece el pais actual
     * @param pais
     */
    public void setPais(Integer pais) {
        this.pais = pais;
    }

    /**
     * Obtiene el mensaje de control asociado
     * @return
     */
    public String getControlMensaje() {
        return controlMensaje;
    }

    /**
     * Establece el mensaje de control asociado
     * @param controlMensaje
     */
    public void setControlMensaje(String controlMensaje) {
        this.controlMensaje = controlMensaje;
    }

    /**
     * Obtiene el mensaje actual
     * @return
     */
    public String getMensaje() {
        return mensaje;
    }

    /**
     * Establce el mensaje actual
     * @param mensaje
     */
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    /**
     * Obtiene el mensaje de no eliminar en caso de que el cliente este asociado
     * a una compra
     * @return
     */
    public String getNoeliminar() {
        return noeliminar;
    }

    /**
     * Establece el mensaje de no eliminar en caso de que el cliente este asociado
     * a una compra
     * @param noeliminar
     */
    public void setNoeliminar(String noeliminar) {
        this.noeliminar = noeliminar;
    }

    /**
     * Obtiene la lista de clientes dependiendo de la consulta
     * @return
     */
    public List getClientes() {
        Ciudad ociudad = clientService.getCiudadById(ciudad);
        clienteBusqueda.setCiudadResidencia(ociudad);
        return clientService.findClientes(clienteBusqueda);
    }

    /**
     * Obtiene la lista de tipos de documento
     * @return
     */
    public SelectItem[] getTiposDocumentos() {
        return clientService.getTiposDocumentos();
    }

    /**
     * Obtiene la lista de paises
     * @return
     */
    public SelectItem[] getPaises() {
        return clientService.getPaises();
    }

    /**
     * Obtiene la lista de departamentos
     * @return
     */
    public SelectItem[] getDepartamentos() {
        return clientService.getDepartamentos(pais);
    }

    /**
     * Obtiene la lista de ciudades
     * @return
     */
    public SelectItem[] getCiudades() {
        return clientService.getCiudades(departamento, pais);
    }

    /**
     * almacena un cliente
     * @return
     */
    public String save() {
        cliente.setCiudadResidencia(clientService.getCiudadById(ciudad));
        clientService.save(cliente);
        pais = 0;
        departamento = 0;
        ciudad = 0;

        return "lista";
    }

    /**
     * Almacena un cliente y devuelve a la ventana de login
     * @return
     */
    public String saveLogin() {
        cliente.setCiudadResidencia(clientService.getCiudadById(ciudad));
        clientService.save(cliente);
        pais = 0;
        departamento = 0;
        ciudad = 0;

        return "login";
    }

    /**
     * Crea una nueva instancia de cliente para comenzar el llando en blanco
     * @return
     */
    public String add() {
        cliente = new Cliente();
        pais = 0;
        departamento = 0;
        ciudad = 0;
        return "detalle";
    }

    /**
     * Permite realizar la edicion de un cliene basado en el documento
     * @return
     */
    public String edit() {
        String id = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        cliente = clientService.getCliente(Long.parseLong(id));
        cliente = cliente.Clone();

        if (cliente.getCiudadResidencia() != null) {
            ciudad = cliente.getCiudadResidencia().getId();
            departamento = cliente.getCiudadResidencia().getDepartamento().getId();
            pais = cliente.getCiudadResidencia().getDepartamento().getPais().getId();
        } else {
            ciudad = 0;
            departamento = 0;
            pais = 0;
        }

        return "detalle";
    }

    /**
     * Elimina un cliente
     * @return
     */
    public String eliminar() {
        clientService.delete(cliente);
        pais = 0;
        departamento = 0;
        ciudad = 0;
        return "lista";
    }

    /**
     * Verifica que el cliente no tenga compras y pueda ser eliminado
     * @return
     */
    public String delete() {
        if (!buyService.hayComprasCliente(cliente)) {
            mensaje = "Está seguro de eliminar el cliente con documento " + cliente.getDocumento() + " ?";
            noeliminar = "";
        } else {
            mensaje = "No es posible eliminar el cliente con documento: " + cliente.getDocumento() + ", tiene compras realizadas";
            noeliminar = "visibility:hidden";
        }
        controlMensaje = "Cancelar";
        return "";
    }
}